import 'package:flutter/material.dart';
import 'package:flutter_easyloading/flutter_easyloading.dart';

/// Loading 提示工具类
/// 
/// 🎨 UI风格：黑底半透明 + 白色文字（类似主页刷新提示）
/// 
/// 使用场景：
/// - `show()`: 发送请求时（如：发布活动、上传图片）
/// - `success()`: 操作成功后（如：发布成功、保存成功）
/// - `error()`: 操作失败时（如：网络错误、验证失败）
/// - `toast()`: 一般性提示（如：图片已删除、已复制）
/// - `progress()`: 文件上传等需要显示进度的场景
/// - `dismiss()`: 手动关闭所有提示
/// 
/// 示例：
/// ```dart
/// // 发送请求
/// LoadingUtil.show('提交中...');
/// await apiService.submit();
/// LoadingUtil.dismiss();
/// LoadingUtil.success('提交成功');
/// 
/// // 错误处理
/// try {
///   LoadingUtil.show('加载中...');
///   await apiService.loadData();
///   LoadingUtil.dismiss();
/// } catch (e) {
///   LoadingUtil.error('加载失败，请重试');
/// }
/// 
/// // 轻提示
/// LoadingUtil.toast('已复制到剪贴板');
/// ```
class LoadingUtil {
  /// 🎨 初始化 EasyLoading 配置（在 main() 中调用）
  static void init() {
    EasyLoading.instance
      ..displayDuration = const Duration(milliseconds: 1000)  // 显示时长
      ..indicatorType = EasyLoadingIndicatorType.fadingCircle // Loading 动画类型
      ..loadingStyle = EasyLoadingStyle.custom                // 自定义样式
      ..indicatorSize = 45.0                                  // 指示器大小
      ..radius = 12.0                                         // 圆角半径
      ..progressColor = Colors.white                          // 进度条颜色
      ..backgroundColor = Colors.black.withOpacity(0.7)       // 🎨 黑底半透明背景
      ..indicatorColor = Colors.white                         // 指示器颜色（白色）
      ..textColor = Colors.white                              // 文字颜色（白色）
      ..maskColor = Colors.black.withOpacity(0.5)             // 遮罩颜色
      ..userInteractions = false                              // 禁止用户交互
      ..dismissOnTap = false                                  // 点击不消失
      ..fontSize = 14.0                                       // 字体大小
      ..lineWidth = 2.0                                       // 线条宽度
      ..maskType = EasyLoadingMaskType.custom                 // 遮罩类型
      ..toastPosition = EasyLoadingToastPosition.center       // 🎨 Toast 位置（中间）
      ..animationStyle = EasyLoadingAnimationStyle.scale;     // 动画样式
  }
  
  // ==================== Loading（加载中）====================
  
  /// 显示 Loading（发送请求时使用）
  /// 
  /// [status] 提示文字，如："提交中..."、"加载中..."、"上传中..."
  /// 
  /// ⚠️ 使用后必须手动调用 `dismiss()` 关闭
  /// 
  /// 示例：
  /// ```dart
  /// LoadingUtil.show('提交中...');
  /// await apiService.submit();
  /// LoadingUtil.dismiss();
  /// ```
  static void show([String? status]) {
    EasyLoading.show(
      status: status ?? '加载中...',
      maskType: EasyLoadingMaskType.custom,  // 🎨 使用自定义遮罩（黑底半透明）
      dismissOnTap: false,                   // 禁止点击关闭
    );
  }
  
  // ==================== Success（成功提示）====================
  
  /// 显示成功提示（操作成功后使用）
  /// 
  /// [message] 成功提示文字，如："发布成功"、"保存成功"
  /// [duration] 显示时长，默认1秒
  /// 
  /// 会自动关闭，无需手动调用 `dismiss()`
  /// 
  /// 示例：
  /// ```dart
  /// LoadingUtil.success('发布成功');
  /// ```
  static void success(String message, {Duration? duration}) {
    EasyLoading.showSuccess(
      message,
      duration: duration ?? const Duration(seconds: 1),
      maskType: EasyLoadingMaskType.custom,  // 🎨 使用自定义遮罩
      dismissOnTap: false,
    );
  }
  
  // ==================== Error（错误提示）====================
  
  /// 显示错误提示（操作失败时使用）
  /// 
  /// [message] 错误提示文字，如："网络连接失败"、"发布失败，请重试"
  /// [duration] 显示时长，默认2秒
  /// 
  /// 会自动关闭，无需手动调用 `dismiss()`
  /// 
  /// 示例：
  /// ```dart
  /// LoadingUtil.error('网络连接失败，请检查网络后重试');
  /// ```
  static void error(String message, {Duration? duration}) {
    EasyLoading.showError(
      message,
      duration: duration ?? const Duration(seconds: 2),
      maskType: EasyLoadingMaskType.custom,  // 🎨 使用自定义遮罩
      dismissOnTap: false,
    );
  }
  
  // ==================== Info（信息提示）====================
  
  /// 显示信息提示（一般性信息提示）
  /// 
  /// [message] 信息提示文字
  /// [duration] 显示时长，默认1秒
  /// 
  /// 会自动关闭，无需手动调用 `dismiss()`
  /// 
  /// 示例：
  /// ```dart
  /// LoadingUtil.info('请先选择开始时间');
  /// ```
  static void info(String message, {Duration? duration}) {
    EasyLoading.showInfo(
      message,
      duration: duration ?? const Duration(seconds: 1),
      maskType: EasyLoadingMaskType.custom,  // 🎨 使用自定义遮罩
      dismissOnTap: false,
    );
  }
  
  // ==================== Toast（轻提示）====================
  
  /// 显示 Toast 轻提示（一般性提示，不影响操作）
  /// 
  /// [message] 提示文字，如："已复制到剪贴板"、"图片已删除"
  /// [duration] 显示时长，默认1秒
  /// [position] 显示位置，默认中间
  /// 
  /// 会自动关闭，无需手动调用 `dismiss()`
  /// 
  /// 示例：
  /// ```dart
  /// LoadingUtil.toast('已复制到剪贴板');
  /// LoadingUtil.toast('图片已删除', position: EasyLoadingToastPosition.top);
  /// ```
  static void toast(
    String message, {
    Duration? duration,
    EasyLoadingToastPosition? position,
  }) {
    EasyLoading.showToast(
      message,
      duration: duration ?? const Duration(seconds: 1),
      toastPosition: position ?? EasyLoadingToastPosition.center,  // 🎨 默认显示在中间
      maskType: EasyLoadingMaskType.clear,  // 🎨 Toast 使用透明遮罩
      dismissOnTap: false,
    );
  }
  
  // ==================== Progress（进度条）====================
  
  /// 显示进度条（文件上传等需要显示进度的场景）
  /// 
  /// [progress] 进度值 0.0-1.0
  /// [status] 进度提示文字，如："上传中... 50%"
  /// 
  /// ⚠️ 使用后必须手动调用 `dismiss()` 关闭
  /// 
  /// 示例：
  /// ```dart
  /// // 显示进度
  /// LoadingUtil.progress(0.5, status: '上传中... 50%');
  /// 
  /// // 更新进度
  /// for (double i = 0; i <= 1.0; i += 0.1) {
  ///   LoadingUtil.progress(i, status: '上传中... ${(i * 100).toInt()}%');
  ///   await Future.delayed(Duration(milliseconds: 100));
  /// }
  /// 
  /// LoadingUtil.dismiss();
  /// LoadingUtil.success('上传完成');
  /// ```
  static void progress(double progress, {String? status}) {
    EasyLoading.showProgress(
      progress,
      status: status,
      maskType: EasyLoadingMaskType.custom,  // 🎨 使用自定义遮罩
    );
  }
  
  // ==================== Dismiss（关闭）====================
  
  /// 关闭所有提示
  /// 
  /// 用于手动关闭 `show()` 和 `progress()` 等需要手动关闭的提示
  /// 
  /// 示例：
  /// ```dart
  /// LoadingUtil.show('加载中...');
  /// await apiService.loadData();
  /// LoadingUtil.dismiss();  // 手动关闭
  /// ```
  static void dismiss() {
    EasyLoading.dismiss();
  }
  
  // ==================== 工具方法 ====================
  
  /// 检查是否正在显示
  static bool get isShow => EasyLoading.isShow;
  
  /// 🔥 快捷方法：执行异步操作并自动处理 Loading
  /// 
  /// [future] 要执行的异步操作
  /// [loadingText] Loading 提示文字
  /// [successText] 成功提示文字（可选）
  /// [showSuccess] 是否显示成功提示，默认 true
  /// 
  /// 自动处理：
  /// 1. 显示 Loading
  /// 2. 执行异步操作
  /// 3. 关闭 Loading
  /// 4. 成功时显示成功提示（可选）
  /// 5. 失败时显示错误提示
  /// 
  /// 返回：操作是否成功
  /// 
  /// 示例：
  /// ```dart
  /// final success = await LoadingUtil.execute(
  ///   future: () => apiService.submit(),
  ///   loadingText: '提交中...',
  ///   successText: '提交成功',
  /// );
  /// 
  /// if (success) {
  ///   // 提交成功后的操作
  /// }
  /// ```
  static Future<bool> execute<T>({
    required Future<T> Function() future,
    String loadingText = '加载中...',
    String? successText,
    bool showSuccess = true,
  }) async {
    try {
      show(loadingText);
      
      await future();
      
      dismiss();
      
      if (showSuccess && successText != null) {
        success(successText);
      }
      
      return true;
      
    } catch (e) {
      dismiss();
      error('操作失败: ${e.toString()}');
      return false;
    }
  }
}

